
package com.ys.chatserver.http.file.u;

import com.eva.framework.utils.LoggerFactory;
import com.ys.chatserver.BaseConf;
import com.ys.chatserver.tool.ImgEqualScaleAndCutHelper;

import java.io.File;
import java.util.HashMap;

/**
 * 图片消息中的图片文件上传处理实现类。
 * <p>
 * <b>说明：</b>本类目前主要适用于各种富客户端上传文件，包括Andriod、iOS设备等，本类
 * 中涉及到的要保存的文件名都假定为已由客户端自行计算并使用该文件的md5码重命名后的文件名，
 * 因而服务端无需再次计算，直接使用即可（从而节省服务端宝贵的计算资源）。也即意味着本类
 * 不适用于Web端，因为一般情况下Web端无法也不适合独立完成文件md5码的计算工作，Web端的文件
 * 上传在RainbowChat中，将使用额外的类和接口，不与APP端混为一谈。
 *
 * @author Json
 * @since 2.0
 */
public class MsgImageUploader extends UploaderRoot {
    @Override
    protected String getFileSaveDir() {
        return BaseConf.getInstance().getDIR_USER_IMAGE_UPLOAD_UNREAD();
    }

    @Override
    protected void onUploadSucess(HashMap<String, Object> parametersFromClient) throws Exception {
        String userUid = (String) parametersFromClient.get("user_uid");
        // 因为服务端是支持多文件上传的API，所以客户端单独把文件名带过来了，方便使用！
        String fileName = (String) parametersFromClient.get("file_name");
        // 客户端传过来的token，用于请求的合法性检查，当前未作强制检查，留作以后使用
        String token = (String) parametersFromClient.get("token");

        LoggerFactory.getLog().debug("[" + getDebugTAG() + "] 用户" + userUid + "的图片消息文件" + fileName
                + "数据上传成功，马上处理其它业务逻辑...(token=" + token + ")");

        // 客户端传过来的数据（参数）的合法性检查
        if (userUid != null && fileName != null) {
            String uploadPath = getFileSaveDir();
            // 图片文件已经保存到的磁盘绝对路径
            File filePath = new File(uploadPath + File.separator + fileName);

            if (filePath.exists()) {
                // 生成原图的缩略图并存到磁盘
                File thumbnailFilePath = new File(uploadPath + File.separator + "th_" + fileName);
                // 如果该md5文件名命名（其实此md5码就是文件数据的指纹）存在，即意味着不需要写入磁盘了
                if (!thumbnailFilePath.exists()) {
                    // 20170306前的缩略图生成算法
//					ImageHelper.scale2(filePath.getAbsolutePath(), thumbnailFilePath.getAbsolutePath()
//							, 100, 100 // 生成的缩略图参考微信按100*100的极限缩放
//							);
                    // 20170306后的缩略图生成算法
                    ImgEqualScaleAndCutHelper.saveImageAsJpg(filePath.getAbsolutePath(), thumbnailFilePath.getAbsolutePath()
                            , 450, 450);// 20190605 ：为了更好的适应高dpi手机，已由原200*200改为450*450
                }
            } else {
                LoggerFactory.getLog().error("[" + getDebugTAG() + "] 用户" + userUid + "的图片消息文件"
                        + fileName + "为何不存在？(绝对路径=" + filePath.getAbsolutePath() + ")");
            }
        } else {
            throw new Exception("[" + getDebugTAG() + "] 无效的参数：userUid=" + userUid + ", fileName=" + fileName + ".");
        }
    }

    @Override
    protected void onUploadFailure(Exception ex) {
        LoggerFactory.getLog().error("[" + getDebugTAG() + "] 处理图片消息上传时出错了，" + ex.getMessage(), ex);
    }

    @Override
    protected String getDebugTAG() {
        return "HTTP图片消息";
    }
}
